Avasta esiosa monorepode võimsus Lerna ja Nx abil. Õpi tööruumi haldust, koodi jagamist ja tõhusaid kompileerimisi suuremahuliste projektide jaoks.
Esiosa monorepo: Lerna ja Nx tööruumi haldus
Esiosa arenduse pidevalt muutuval maastikul võib suurte ja keerukate projektide haldamine olla märkimisväärne väljakutse. Traditsioonilised mitme repositooriumi seadistused, pakkudes küll isolatsiooni, võivad viia koodi dubleerimiseni, sõltuvuste haldamise peavaludeni ja ebajärjekindla tööriistastuseni. Siin tulebki esile monorepo arhitektuur. Monorepo on üks repositoorium, mis sisaldab mitut sageli seotud projekti, mida ehitatakse ja versioonitakse koos. See lähenemine pakub arvukalt eeliseid, kuid monorepo tõhus haldamine nõuab spetsiaalseid tööriistu. Käesolev artikkel uurib kahte populaarset lahendust: Lerna ja Nx.
Mis on monorepo?
Monorepo on versioonihaldussüsteemi repositoorium, mis sisaldab koodi paljude projektide jaoks. Need projektid võivad olla seotud või täiesti sõltumatud. Peamine on see, et nad jagavad sama repositooriumi. Ettevõtted nagu Google, Facebook, Microsoft ja Uber on edukalt kasutusele võtnud monorepod oma tohutute koodibaaside haldamiseks. Mõelge Google'ile, kes hoiab peaaegu kogu oma koodi, sealhulgas Androidi, Chrome'i ja Gmaili, ühes repositooriumis.
Monorepo eelised
- Koodi jagamine ja taaskasutamine: Jagage koodi hõlpsalt projektide vahel ilma keerukate pakendamise ja avaldamise töövoogudeta. Kujutage ette disainisüsteemi teeki, mida saab sujuvalt integreerida mitmesse rakendusse samas repositooriumis.
- Lihtsustatud sõltuvuste haldamine: Hallake sõltuvusi ühes kohas, tagades järjepidevuse kõigis projektides. Jagatud teegi sõltuvuse värskendamine värskendab automaatselt kõiki sellest sõltuvaid projekte.
- Atoomilised muudatused: Tehke muudatusi, mis hõlmavad mitut projekti ühes commi'is, tagades järjepidevuse ja lihtsustades testimist. Näiteks saab nii esiosa kui ka tagaosa mõjutava refaktooringu teha atoomiliselt.
- Parem koostöö: Meeskonnad saavad hõlpsalt koostööd teha erinevate projektide kallal samas repositooriumis, soodustades teadmiste jagamist ja valdkonnaülest arendust. Arendajad saavad hõlpsalt sirvida ja mõista koodi erinevates meeskondades.
- Järjepidev tööriistastus ja praktikad: Jõustage järjepidevaid kodeerimisstandardeid, lintimisreegleid ja ehitusprotsesse kõigis projektides. See parandab koodi kvaliteeti ja hooldatavust.
- Lihtsustatud refaktooring: Suuremahulised refaktooringuprojektid on lihtsustatud, kuna kogu seotud kood on samas repositooriumis. Kogu koodibaasis saab kasutada automatiseeritud refaktooringu tööriistu.
Monorepo väljakutsed
- Repositooriumi suurus: Monorepod võivad muutuda väga suureks, mis võib aeglustada kloonimise ja indekseerimise toiminguid. Tööriistad nagu `git sparse-checkout` ja `partial clone` aitavad seda probleemi leevendada.
- Kompileerimise ajad: Kogu monorepo kompileerimine võib olla aeganõudev, eriti suurte projektide puhul. Tööriistad nagu Lerna ja Nx pakuvad selle lahendamiseks optimeeritud kompileerimisprotsesse.
- Juurdepääsukontroll: Juurdepääsu piiramine monorepo spetsiifilistele osadele võib olla keeruline. Nõutav on hoolikas planeerimine ja juurdepääsukontrolli mehhanismide rakendamine.
- Tööriistastuse keerukus: Monorepo seadistamine ja haldamine nõuab spetsiaalseid tööriistu ja teadmisi. Alguses võib õppimiskõver olla järsk.
Lerna: JavaScripti projektide haldamine monorepos
Lerna on populaarne tööriist JavaScripti projektide haldamiseks monorepos. See optimeerib mitmepakiliste repositooriumide haldamise töövoogu Giti ja npm-iga. See sobib eriti hästi projektidele, mis kasutavad sõltuvuste haldamiseks npm-i või Yarn-i.
Lerna põhifunktsioonid
- Versiooni haldamine: Lerna suudab automaatselt versioonida ja avaldada pakette vastavalt viimase väljalaske järel tehtud muudatustele. See kasutab järgmise versiooninumbri määramiseks konventsionaalseid commite.
- Sõltuvuste haldamine: Lerna haldab pakettidevahelisi sõltuvusi, tagades, et monorepo sees olevad paketid saavad üksteisest sõltuda. See kasutab sümlinkimist kohalike sõltuvuste loomiseks.
- Ülesande täitmine: Lerna suudab käske täita mitme paketi vahel paralleelselt, kiirendades kompileerimis- ja testimisprotsesse. See toetab skriptide käivitamist, mis on määratletud `package.json`-is.
- Muudatuste tuvastamine: Lerna suudab tuvastada, millised paketid on viimase väljalaske järel muutunud, võimaldades sihipäraseid kompileerimisi ja juurutusi.
Lerna kasutusnäide
Illustreerime Lerna kasutust lihtsustatud näitega. Oletame, et meil on monorepo kahe paketiga: `package-a` ja `package-b`. `package-b` sõltub `package-a`-st.
monorepo/
├── lerna.json
├── package.json
├── packages/
│ ├── package-a/
│ │ ├── package.json
│ │ └── index.js
│ └── package-b/
│ ├── package.json
│ └── index.js
1. Initsialiseeri Lerna:
lerna init
See loob `lerna.json` faili ja värskendab juurkataloogi `package.json` faili. `lerna.json` fail konfigureerib Lerna käitumist.
2. Installi sõltuvused:
npm install
# or
yarn install
See installib kõikide monorepos olevate pakettide sõltuvused, tuginedes iga paketi `package.json` failidele.
3. Käivita käsk üle pakettide:
lerna run test
See käivitab `test` skripti, mis on määratletud kõikides pakettide `package.json` failides, kus see on olemas.
4. Avalda paketid:
lerna publish
See käsk analüüsib commiti ajalugu, määrab, millised paketid on muutunud, suurendab nende versioone konventsionaalsete commitide alusel ja avaldab need npm-i (või teie valitud registrisse).
Lerna konfiguratsioon
The `lerna.json` fail on Lerna konfiguratsiooni süda. See võimaldab teil kohandada Lerna käitumist, näiteks:
- `packages`: Määrab pakettide asukoha monorepos. Sageli on see seatud väärtusele `["packages/*"]`.
- `version`: Määrab versioonimisstrateegia. Saab olla `independent` (igal paketil on oma versioon) või fikseeritud versioon.
- `command`: Võimaldab konfigureerida valikuid spetsiifiliste Lerna käskude jaoks, näiteks `publish` ja `run`.
Näide `lerna.json`:
{
\"packages\": [
\"packages/*\"
],
\"version\": \"independent\",
\"npmClient\": \"npm\",
\"useWorkspaces\": true,
\"command\": {
\"publish\": {
\"conventionalCommits\": true,
\"message\": \"chore(release): publish\"
}
}
}
Nx: Nutikas, kiire ja laiendatav ehitussĂĽsteem
Nx on võimas ehitussüsteem, mis pakub täiustatud funktsioone monorepo haldamiseks. See keskendub järkjärgulistele kompileerimistele, arvutuste vahemällu salvestamisele ja ülesannete orkestratsioonile, et oluliselt parandada kompileerimisaegu ja arendajate tootlikkust. Kuigi Lerna on peamiselt keskendunud pakettide haldamisele, pakub Nx põhjalikumat lähenemist kogu monorepo töövoo haldamiseks, sealhulgas koodi genereerimisele, lintimisele, testimisele ja juurutamisele.
Nx põhifunktsioonid
- Järkjärgulised kompileerimised: Nx analüüsib teie projektide sõltuvuste graafikut ja kompileerib uuesti ainult need projektid, mis on viimase kompileerimise järel muutunud. See vähendab oluliselt kompileerimisaegu.
- Arvutuste vahemällu salvestamine: Nx salvestab ülesannete (nt kompileerimiste ja testide) tulemused vahemällu, nii et neid saab uuesti kasutada, kui sisendid pole muutunud. See kiirendab arendustsükleid veelgi.
- Ülesannete orkestratsioon: Nx pakub võimsat ülesannete orkestratsiooni süsteemi, mis võimaldab teil määratleda keerulisi kompileerimistorustikke ja neid tõhusalt käivitada.
- Koodi genereerimine: Nx pakub koodi genereerimise tööriistu, mis aitavad teil kiiresti luua uusi projekte, komponente ja mooduleid, järgides parimaid tavasid ja järjepidevaid standardeid.
- Pistikprogrammide ökosüsteem: Nx-il on rikas pistikprogrammide ökosüsteem, mis toetab erinevaid tehnoloogiaid ja raamistikke, nagu React, Angular, Node.js, NestJS ja palju muud.
- Sõltuvusgraafiku visualiseerimine: Nx suudab visualiseerida teie monorepo sõltuvusgraafikut, aidates teil mõista projektide vahelisi seoseid ja tuvastada võimalikke probleeme.
- Mõjutatud käsud: Nx pakub käske ülesannete käivitamiseks ainult projektidel, mida konkreetne muudatus mõjutab. See võimaldab teil keskenduda oma jõupingutused valdkondadele, mis vajavad tähelepanu.
Nx kasutusnäide
Illustreerime Nx-i kasutamist lihtsustatud näitega. Loome monorepo koos Reacti rakenduse ja Node.js teegiga.
1. Installi Nx CLI globaalselt:
npm install -g create-nx-workspace
See loob uue Nx tööruumi koos Reacti rakendusega. Valik `--preset=react` käsib Nx-il initsialiseerida tööruumi Reacti-spetsiifiliste konfiguratsioonidega.
2. Loo uus Nx tööruum:
create-nx-workspace my-monorepo --preset=react
cd my-monorepo
This creates a new Nx workspace with a React application. The `--preset=react` option tells Nx to initialize the workspace with React-specific configurations.
3. Genereeri teek:
nx generate @nrwl/node:library my-library
See genereerib uue Node.js teegi nimega `my-library`. Nx konfigureerib teegi ja selle sõltuvused automaatselt.
4. Kompileeri rakendus:
nx build my-app
See kompileerib Reacti rakenduse. Nx analüüsib sõltuvuste graafikut ja kompileerib uuesti ainult vajalikud failid.
5. Käivita testid:
nx test my-app
See käivitab Reacti rakenduse ühikutestid. Nx vahemällustab testide tulemused, et kiirendada järgnevaid testide käivitamisi.
6. Vaata sõltuvuste graafikut:
nx graph
See avab veebiliidese, mis visualiseerib monorepo sõltuvuste graafikut.
Nx konfiguratsioon
Nx konfigureeritakse `nx.json` faili kaudu, mis asub tööruumi juurkataloogis. See fail määratleb tööruumi projektid, nende sõltuvused ja ülesanded, mida nendel saab täita.
Põhilised konfiguratsioonivalikud `nx.json` failis on järgmised:
- `projects`: Määrab tööruumi projektid ja nende konfiguratsiooni, näiteks nende juurkataloogi ja kompileerimissihtmärgid.
- `tasksRunnerOptions`: Konfigureerib ülesannete täitja, mis vastutab ülesannete täitmise ja nende tulemuste vahemällu salvestamise eest.
- `affected`: Konfigureerib, kuidas Nx määrab, milliseid projekte muudatus mõjutab.
Näide `nx.json`:
{
\"npmScope\": \"my-org\",
\"affected\": {
\"defaultBase\": \"main\"
},
\"implicitDependencies\": {
\"package.json\": {
\"dependencies\": \"*\",
\"devDependencies\": \"*\"
},
\".eslintrc.json\": \"*\"
},
\"tasksRunnerOptions\": {
\"default\": {
\"runner\": \"nx-cloud\",
\"options\": {
\"cacheableOperations\": [\"build\", \"lint\", \"test\", \"e2e\"],
\"accessToken\": \"...\",
\"canTrackAnalytics\": false,
\"showUsageWarnings\": false
}
}
},
\"targetDefaults\": {
\"build\": {
\"dependsOn\": [\"^build\"],
\"inputs\": [\"production\", \"default\"],
\"outputs\": [\"{projectRoot}/dist\"]
}
},
\"namedInputs\": {
\"default\": [\"{projectRoot}/**/*\", \"!{projectRoot}/dist/**/*\", \"!{projectRoot}/tmp/**/*\"],
\"production\": [\"!{projectRoot}/**/*.spec.ts\", \"!{projectRoot}/**/*.spec.tsx\", \"!{projectRoot}/**/*.spec.js\", \"!{projectRoot}/**/*.spec.jsx\"]
},
\"generators\": {
\"@nrwl/react\": {
\"application\": {
\"style\": \"css\",
\"linter\": \"eslint\",
\"unitTestRunner\": \"jest\"
},
\"library\": {
\"style\": \"css\",
\"linter\": \"eslint\",
\"unitTestRunner\": \"jest\"
},
\"component\": {
\"style\": \"css\"
}
}
}
}
Lerna vs. Nx: Kumba valida?
Nii Lerna kui ka Nx on suurepärased tööriistad esiosa monorepode haldamiseks, kuid need vastavad veidi erinevatele vajadustele. Siin on võrdlus, mis aitab teil oma projekti jaoks õige valida:
| Funktsioon | Lerna | Nx |
|---|---|---|
| Fookus | Paketihaldus | KompileerimissĂĽsteem ja ĂĽlesannete orkestratsioon |
| Järkjärgulised kompileerimised | Piiratud (nõuab väliseid tööriistu) | Sisseehitatud ja kõrgelt optimeeritud |
| Arvutuste vahemällu salvestamine | Ei | Jah |
| Koodi genereerimine | Ei | Jah |
| Pistikprogrammide ökosüsteem | Piiratud | Ulatuslik |
| Õppimiskõver | Madalam | Kõrgem |
| Keerukus | Lihtsam | Keerulisem |
| Kasutusjuhtumid | Projektid, mis on peamiselt keskendunud npm-pakettide haldamisele ja avaldamisele. | Suured ja keerukad projektid, mis vajavad optimeeritud kompileerimisaegu, koodi genereerimist ja põhjalikku ehitussüsteemi. |
Vali Lerna, kui:
- Teil on peamiselt vaja hallata ja avaldada npm-pakette.
- Teie projekt on suhteliselt väike kuni keskmise suurusega.
- Eelistate lihtsamat tööriista madalama õppimiskõveraga.
- Olete juba tuttav npm-i ja Yarn-iga.
Vali Nx, kui:
- Vajate optimeeritud kompileerimisaegu ja järkjärgulisi kompileerimisi.
- Soovite koodi genereerimise võimalusi.
- Vajate põhjalikku ehitussüsteemi koos ülesannete orkestratsiooniga.
- Teie projekt on suur ja keeruline.
- Olete valmis investeerima aega võimsama tööriista õppimisse.
Kas Lerna saab kasutada koos Nx-iga?
Jah, Lerna ja Nx-i saab kasutada koos. See kombinatsioon võimaldab teil ära kasutada Lerna paketihalduse võimalusi, saades samal ajal kasu Nx-i optimeeritud kompileerimissüsteemist ja ülesannete orkestratsioonist. Nx-i saab konfigureerida Lerna ülesannete käivitajana, pakkudes järkjärgulisi kompileerimisi ja arvutuste vahemällu salvestamist Lerna hallatavate pakettide jaoks.
Parimad praktikad esiosa monorepo haldamiseks
Sõltumata sellest, kas valite Lerna või Nx-i, on parimate tavade järgimine esiosa monorepo edukaks haldamiseks ülioluline:
- Looge selge projektistruktuur: Korraldage oma projektid loogiliselt ja järjepidevalt. Kasutage pakettide ja teekide jaoks selget nimekonventsiooni.
- Jõustage järjepidevaid kodeerimisstandardeid: Kasutage linte ja formaatereid, et tagada järjepidev koodistiil kõigis projektides. Tööriistu nagu ESLint ja Prettier saab integreerida teie töövoogu.
- Automatiseerige kompileerimis- ja testimisprotsessid: Kasutage CI/CD torujuhtmeid kompileerimise, testimise ja juurutamise protsesside automatiseerimiseks. Kasutada saab tööriistu nagu Jenkins, CircleCI ja GitHub Actions.
- Rakendage koodiülevaatusi: Viige läbi põhjalikud koodiülevaatused, et tagada koodi kvaliteet ja hooldatavus. Kasutage tõmbepäringuid ja koodiülevaatuse tööriistu.
- Jälgige kompileerimisaegu ja jõudlust: Jälgige kompileerimisaegu ja jõudlusmõõdikuid, et tuvastada kitsaskohad ja parandamist vajavad valdkonnad. Nx pakub tööriistu kompileerimisjõudluse analüüsimiseks.
- Dokumenteerige oma monorepo struktuur ja protsessid: Looge selge dokumentatsioon, mis selgitab teie monorepo struktuuri, kasutatavaid tööriistu ja tehnoloogiaid ning arendusvooge.
- Võtke kasutusele konventsionaalsed commitid: Kasutage konventsionaalseid commite versioonimise ja väljalaskeprotsesside automatiseerimiseks. Lerna toetab konventsionaalseid commite kohe karbist välja.
Järeldus
Esiosa monorepod pakuvad märkimisväärseid eeliseid suurte ja keerukate projektide haldamiseks, sealhulgas koodi jagamine, lihtsustatud sõltuvuste haldamine ja parem koostöö. Lerna ja Nx on võimsad tööriistad, mis aitavad teil esiosa monorepot tõhusalt hallata. Lerna on suurepärane valik npm-pakettide haldamiseks, samas kui Nx pakub põhjalikumat ehitussüsteemi täiustatud funktsioonidega, nagu järkjärgulised kompileerimised ja koodi genereerimine. Oma projekti vajadusi hoolikalt kaaludes ja parimaid tavasid järgides saate edukalt kasutusele võtta esiosa monorepo ja saada sellest kasu.
Lerna ja Nx-i vahel valides pidage meeles arvestada selliste teguritega nagu teie meeskonna kogemus, projekti keerukus ja jõudlusnõuded. Katsetage mõlema tööriistaga ja leidke see, mis sobib teie konkreetsete vajadustega kõige paremini.
Edu teie monorepo teekonnal!